Orientation: x = east-west, z = north-south, y = up-down.

Issues this specification does not cover currently:
  * Sloping floors, non-orthogonal walls, walls made of different materials
  
  

Attributes

spSuper: The object which is 'above' this object in the space tree
spSub: Hash, where the keys are the stringified references to the objects which are 'below' this object in the space tree, and the values are the role of the object (see below)
spSubRoles: Hash, where the keys are roles and the values are as for spSub.
spSubLocations: Hash, where the keys are as in spSub, and the values are arrays of [x,y,z] position for the objects. This attribute does not exist if the [super]'s class is such that it has no coordinate system.

spVelocity: [x,y,z], object's velocity. Notice that whenever an object's velocity changes, its [sub]s' velocities should be changed by the inverse, to simulate them 'staying still' while their [super] moves. Also, the [sub]s' [sub]s should NOT be affected. (Another thought: perhaps the routine for changing velocity should enforce the 'equal and opposite reaction' law?) 

spClass: The fundamental nature of the object. Possible values are 'real', 'virtual', 'composite', 'none', and 'group'. Default is 'real'.
spShape: What spatial model is used for collision detection etc. Possible values are 'sphere', 'box', 'blob', 'gas', and 'liquid'. Default is 'blob'.

spSphereRadius: Radius of a 'sphere' or 'blob'-shape object.
spSphereInterior: Radius of interior space of a sphere.
spBoxExtent: Size of a 'box'-shape object, in form [-x,+x,-y,+y,-z,+z].
spBoxWalls: Thickness of walls of a 'box'-shape object, in the same arrangement as spBoxExtent; e.g. element [2] is the thickness of the bottom surface of the box. The walls' "origin" is at the outside - they do not make the box larger.
spBoxDoors: to be decided.
spBlobBulk: A rough estimate of how awkward the object is. For example, a brick would be 1, a chair would be 10, an arrow or spear would be 4. This value is essentially a multiplier applied to the volume of the object, so it should NOT be made larger for large objects.
spBlobDiameter: Average 'length' of the object. If unspecified, ...
spBlobShape: For purposes of clothing and similar things, this is a string describing the object's shape.
spBlobFitShape: String; for a [sub] to be in role 'covered', its spBlobFitShape must match the [super]'s spBlobShape.
spBlobFitScale: Number; for a [sub] to be in role 'covered', its spBlobFitScale must roughly equal the [super]'s spBlobFitScale, +/- 1.0. This value is not tied to any particular scale, and comparing it between objects of different spBlob[Fit]Shapes is meaningless.

spMaterial: the name of the material the object is made of, if applicable.
spMass: In grams.
Note that weight is computed from mass, density is specified by the material, and volume is density * weight. Also, density changes caused by temperature are handled by material phase changes.

spTemperature: duh. Specified in centigrade (celsius?).

spInteriorType: 'space', 'jumble'
spRetention: Minimum dimension of object that can be held by this container. 0 is airtight, anything greater isn't. (Example of an object with a large retention value would be a net.)

**Need to specify which attributes are only changed thru accessors, and which attributes need watchers

Methods

spAddVelocity(x, y, z) ---


Notes

This specification does not define means for determining the purpose/behavior of an object.

Role definitions:
  * interior: The [sub]'s origin is within the bounds of the [super].
  * component: The [sub] is an integral part of the [super]. This role is only allowed for [super]s of class 'composite'.
  * permeate: Same as 'component', but allowable for any class of [super]; the [sub] would usually be of shape 'liquid' (?).
  * supported: The [sub] is held against gravity by the [super], but is not completely within the [super]'s bounds.
  * covered: The [sub] is partially or completely covering the [super]. This role is only allowed for [sub]s of shape 'blob'.

Shape definitions:
  * sphere: Object is roughly spherical; enough so that it rolls. This might also be used for small cylindrical objects.
  * box: Object is box-shaped, with specific sizes and walls. See the spBox* attributes.
  * blob: Object is either flexible, squishy, or sufficiently complex to be not worth modeling.
  * gas, liquid: Object has no form other than its volume, and will split/recombine in order to flow/spread. Note that a single gas object in a container implies that it fills the entire interior of the object, and liquids should be considered to fill the bottom of their container. Liquids may also be a component of an object, implying that the object has become soaked.

Class definitions:
  * real: Just ordinary single objects.
  * virtual: No atoms involved, just a piece of space. Not affected by gravity. This would be used for descriptive purposes, or perhaps the area of a magical effect. It may also be implicitly created by the object's 
  * composite: An object that is composed of other objects. spShape is ignored for this class. This allows the 'component' role for its sub-objects. Note that a composite of liquids or gases is possible.
  * none: Object has no presence in the physical world, just (possibly) a location. This would be used mainly for symbolic objects, or any other non-physical/spatial object. Only administrators would be able to directly act upon such objects.
  * group: Like virtual, except that it's used to group a set of objects under one description - it can be destroyed whenever appropriate. Note that any effects/affects should be applied to its contents, not itself. (Except, perhaps... something that requires an arrangement of objects to remain undisturbed (magic, really advanced machinery, house of cards))